import Vue from 'vue'
import Vuex from 'vuex'
import { createLogger } from 'vuex'

import {
  shopcart_list,
  shopcart_clear,
  shopcart_add,
  shopcart_sub,
  shop_fav,
  shop_unfav
} from '../utils/api'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {  //存储 数据( 都是响应式数据 )
    shopcartlist:[], //存储加入购物车的数据
    shoplist:[],//存储收藏的店铺
  },
  mutations: {  //定义 同步方法 ( 可以直接修改state中的数据 )
    add(state , params){ //数量加1 , 参数一: 整个state对象, 参数二: 在组件中调用该函数时传入的参数( 可以是任何类型 )
      //任何一个加入购物车的商品对象 都包含以下属性: userid, count, 商品的基本属性等.
      var good = state.shopcartlist.find((item)=>{
        return item.id == params.id;
      })

      if( good ){ //如果条件成立, 说明 params这个 商品对象已经加入购物车了
        good.count++;
      }else{ //如果执行else, 说明 params这个商品对象 不在购物车中(初次加入购物车)
        //params.count = 1;
        var obj = {...params,count:1}
        state.shopcartlist.push( obj );
      }

    },
    sub(state , params){ //数量减1
      var index = state.shopcartlist.findIndex((item)=>{
        return item.id == params.id;
      })
      if( index != -1 ){ //条件成立, 说明 该商品在购物车中
        if( state.shopcartlist[index].count > 1 ){ //数量是否大于1
          state.shopcartlist[index].count--;
        }else{
          state.shopcartlist.splice(index,1);
        }
      }

    },
    clear(state){ //清空购物车中的数据
      state.shopcartlist = [];
    },
    save_shopcartlist( state, params ){ //保存购物车列表(从服务器请求来的购物车列表)
      state.shopcartlist = params;
    },
    fav(state, params){ //收藏店铺
      if( params ){
        state.shoplist.push( params );
      }
    },
    unfav(state, params ){ //取消收藏店铺
      //查找店铺
      var index = state.shoplist.findIndex((item)=>{
        return item.mtWmPoiId == params.mtWmPoiId;
      })
      //从收藏的店铺列表中 将该店铺删除
      if( index != -1 ){
        state.shoplist.splice(index,1);
      }
    }
  },
  actions: { //定义 异步方法( 在异步方法中执行异步代码(发请求/创建定时器) )
    //request_shopcartlist( {commit} ){
    request_shopcartlist( store ){ //发请求  获取购物车 中的商品列表
      var userinfo = localStorage.getItem('userinfo') ? JSON.parse( localStorage.getItem('userinfo') ) : {}
      //获取购物车 中的商品列表
      shopcart_list( {userid: userinfo.id } ).then((res)=>{
        //存储购物车数据 到vuex
        //this.commit('save_shopcartlist', res.data.list );
        //commit('save_shopcartlist', res.data.list );
        store.commit('save_shopcartlist', res.data.list );
      })
    },
    request_clear(store){ //发请求, 清空购物车
      var userinfo = localStorage.getItem('userinfo') ? JSON.parse( localStorage.getItem('userinfo') ) : {};
      
      if( userinfo.id ){
        shopcart_clear( { userid:userinfo.id } ).then((res)=>{
          //清空 vuex 中的shopcartlist
          store.commit('clear');
        })
      }
    },
    request_add(store,good){ //发请求, 数量加1
      var userinfo = localStorage.getItem('userinfo') ? JSON.parse( localStorage.getItem('userinfo') ) : {};
          
      //发请求, 让商品数量加1, 最终数据存储在后端 数据库中
        if( userinfo.id ){
          shopcart_add( { userid:userinfo.id,goodid: good.id } ).then((res)=>{
            //将 需要加入购物车的商品 往vuex中也存一份
            store.commit('add', good );
          })
        }
    },
    request_sub(store,good){ //发请求,数量减1
      var userinfo = localStorage.getItem('userinfo') ? JSON.parse( localStorage.getItem('userinfo') ) : {};
          
      //发请求, 让商品数量减1, 最终数据存储在后端 数据库中
        if( userinfo.id ){
          shopcart_sub( { userid:userinfo.id,goodid: good.id } ).then((res)=>{
            //将 需要加入购物车的商品 往vuex中也存一份
            store.commit('sub', good );
          })
        }
    },
    request_fav(store,shop){ //发请求, 收藏店铺
      var userinfo = localStorage.getItem('userinfo') ? JSON.parse( localStorage.getItem('userinfo') ) : {};
      shop_fav( { userid: userinfo.id, shopid: shop.mtWmPoiId } ).then((res)=>{
        if( res.data.code == 200 ){
          //同步到vuex
          store.commit('fav', shop);
        }
      })
    },
    request_unfav(store,shop){ //发请求, 收藏店铺
      var userinfo = localStorage.getItem('userinfo') ? JSON.parse( localStorage.getItem('userinfo') ) : {};
      shop_unfav( { userid: userinfo.id, shopid: shop.mtWmPoiId } ).then((res)=>{
        if( res.data.code == 200 ){
          //同步到vuex
          store.commit('unfav', shop);
        }
      })
    }
  },
  modules: { //实现 模块化开发
  },
  getters: { //定义 计算方法( 类似计算属性 )
    totalPrice(state){
      var tp = state.shopcartlist.reduce((t,i)=>{
        return t + i.count*i.min_price;
      },0)
      return Number(tp).toFixed(2);
    },
    totalCount(state){
      var tp = state.shopcartlist.reduce((t,i)=>{
        return t + i.count;
      },0)
      return Number(tp).toFixed(0);
    },

  },
  plugins:[ createLogger() ] //应用 插件
})
